Software development plays a significant role in the global economy. Large companies in the business of, for example, providing enterprise computing services and solutions generally have software application development programs involving significant annual expenditures. Notwithstanding the significant resources devoted to it, certain problems continue to plague software development. Such problems are well known, and include, for example, cost overruns, delays, bugs and errors, and maintenance, to name a few.
Many attempts have been made to address the problems associated with software development, and thus improve the software development process and its efficiency. Examples of such attempts include the System Life Cycle initiative of Electronic Data Systems (“EDS”), of Plano Tex., as well as the Software Engineering Institute—Capability Maturity Model (SEI-CMM) undertaken within the software industry. One problem that has not been fully addressed, however, is redundancy.
As can be appreciated, a better understanding of existing software can aid in the development of future software. In fact, if it were possible to do so, a large amount of existing software could be used as analogues or models for solving related or similar problems in new software. Moreover, many lines of existing code could be used as-is, or with minor additions, as part of new software applications. Traditionally, however, software developers do not reuse significant amounts of existing software. They thus spend much of their time creating and documenting new code. The comments provided with software code, as well as the code itself, can often provide much insight into the purpose, design, and characteristics of the software. The same is true for manuals and other documentation provided with such software. Nonetheless, manually reading extant software and its associated documentation for useful models is often prohibitively time consuming. It is therefore not attempted on a large scale.
In sum, although software development entities could utilize the vast resources hidden in existing software maintained by their organization, they rarely do so. Event though useful code could be found in current or past applications, or residing on one or more files on a given software developer's or computer engineer's computer within an organization, the conventional method currently used to exploit these hidden resources is extremely low-tech: word-of-mouth.
To illustrate, the following is an example of the conventional approach to using existing code in software development. Assume that a software developer or a computer engineer has an application which she is working on. She desires to write some code to implement a given functionality within that application. She is generally aware that, although some of the inputs and outputs may be different, the general functionality she desires to implement is very similar, if not identical to, functionalities that have been implemented in similar code by her present or former colleagues. Such old code may be, for example, in a different coding language (e.g., Fortran, Cobol, C/++, Pascal, or Java) but implementing the same function as is presently desired. For example, the existing code could assume a 16-bit File Allocation Table (“FAT”) as opposed to a desired 32-bit FAT, or be a computer diagnostic tool for reading and processing digital radiological images specific to an older modality as opposed to a desired newer one. In each of these examples, simply adapting pre-existing old code could expedite the current software coding requirement.
Nonetheless, in the example discussed above, since there is neither a central search mechanism nor a central archive in which all software within her organization is automatically categorized and archived for easy retrieval, the software developer probably either (a) queries her current colleagues “Do you have any code that would do XYZ?” or (b) sends an email querying her department or the overall company seeking the same information. If one of her colleagues happens to recall similar code, he or she may so inform her orally or via email.
Beyond such word of mouth methods, there is generally no intelligence that bridges the gap between someone who needs specific code at a given moment and someone who happens to have the code sitting on their hard drive. Few, if any, of her colleagues will take the time to thoroughly search even their own files, let alone undertake a departmental or company-wide search. Thus, left with few remaining choices she simply takes the path of least resistance and re-invents the wheel.
While there are a few websites which maintain modest software libraries, the contents of these libraries tends to be very limited, and the software stored there is only accessible by browsing. Such websites simply do not contain enough code to be generally useful, and offer no intelligence or assistance to a user who is trying to locate a particular kind of software to accomplish particular defined functionalities. It is simply inefficient to browse through lines of code online trying to find a particular function in a “codestack.”
Thus, beyond word of mouth efforts, existing methods of software reuse are limited to manually browsing and searching, for example, databases, class libraries and/or web pages for similar software components. This method is very tedious, is limited to a small number of software components, and is generally not performed.
While the notion of “software reuse” has been discussed for many years in connection with software components, class libraries or objects, despite all such efforts, a comprehensive technical solution does not yet exist to assist with the efficient reuse of software. As a result, many existing software components are unnecessarily re-developed and re-tested. This results in wasted time and money as well as risking quality problems.
What is needed in the art is a system and method which facilitates the large scale storing, searching for and accessing of pre-existing software.